/**
 * Copyright (c) 2012, Brent Mucci, Ken Anderson
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice, 
 *    this list of conditions and the following disclaimer in the documentation 
 *    and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR 
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 **/

#ifndef _MCL_BITMAP_IMAGE
#define _MCL_BITMAP_IMAGE

#include <string>
#include <fstream>

#include "mcl_image.h"

namespace mcl
{

// Loads a 24-bit bitmap image.
class BitmapLoader
{
public:
	// Constructor/deconstructor
	BitmapLoader()  {}
	~BitmapLoader() {}

	// Load 24-bit image from file.
	// Returns true on success
	bool load( const std::string &filename, Image & image ) const;

private:
	// Reads the image (non-header) data from the file and converts it to 32-bit RGBA format.
	bool readData( std::ifstream & file, Image & image, const unsigned int dataSize ) const;
};

// Writes a 24-bit bitmap image.
class BitmapWriter
{
public:
	// Constructor/deconstructor
	BitmapWriter() {}
	~BitmapWriter() {}

	// Writes a 24-bit image to file.
	// Returns true on success
	bool write( const std::string &filename, const Image & image ) const;

private:
	// Writes the image (non-deader) data to the file after converting it to 24-bit BGR format.
	bool writeData( std::ofstream & file, const Image & image ) const;
};

}; // namespace

#endif
